Technical Note TN2076
I/O Kit Power Controller

目次

このテクニカルノートでは、電源管理をサポートする I/O Kit KEXT について簡単に説明します。

電源管理について学習する時間のない方は、本稿を読めば、電源管理機能を KEXT に追加するために必要な手順をすぐに理解できます。

急いでいる場合は、下記の Project Builder KEXT をダウンロードして、システムログを開き、カーネル拡張をビルドします。KEXT のロード、電源イベントの登録、スリープイベントへの応答を観察できます。次にドライバにコード(それほど大きなものでありません)をコピー&ペーストできます。

最後に、電源管理に関するその他のドキュメント、サンプル、DDK などを紹介するセクションがあり、時間に余裕があれば、Mac OS X の電源管理についてのすべてを学習できます。

[2003 年 6 月 20 日]



I/O Kit 電源コントローラ:クィックルック

I/O Kit の電源コントローラは、通常、ドライバ (KEXT) 経由で、I/O デバイスへの電圧 (Vcc ) と電流 (i) を制御する実体です。

KEXT を電源コントローラにするには、次のことを実施する必要があります。

電源状態の配列を作成します。この配列は、電源関連のパラメータ、すなわち電流上昇とセトリングタイム、定常状態電流などの要件を定義します。

KEXT を I/O Kit に登録します。このステップで、デバイスは I/O レジストリの IOPower プレーンに置かれます。

プロバイダの setPowerState メソッドをオーバーライドします。setPowerState メソッドは、電源オンと電源オフのメッセージを受け取ります。KEXT は、KEXT で必要とされることがある状態情報を含め、デバイスとの電源の切断と復旧に必要な処理を実行しなければなりません。

以下に、これら 3 つのステップについて詳しく説明します。

先頭に戻る



電源状態の配列

Developer SDK に含まれている電源状態の配列は、次のパスにあります。

/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/IOKit/pwr_mgt/IOPMpowerState.h

リスト 1 に示すサンプルには、「オン」と「オフ」の 2 つの状態の電源状態配列があります。2 つの状態からなる配列(オン/オフ)は、一般的であり、電源管理コードを KEXT に追加する簡単な方法となります。詳細については、「I/O Kit Fundamentals」の 10 章と、「ダウンロード」で紹介している HelloIOKitWithPowerManagement プロジェクトのヘッダファイルを参照してください。

詳細については、最後に挙げるプロジェクトのヘッダファイルと、「I/O Kit Fundamentals」の 10 章を参照してください。

これで最初のステップは終了です。次に、電源状態の配列を登録する必要があります。



リスト 1. 電源状態の列挙と配列

enum {

    kDTSOffState = 0,

    kDTSOnState = 1,

    kNumDTSStates = 2

    };

static const IOPMPowerState ourPowerStates[kNumDTSStates] = {

    {kIOPMPowerStateVersion1,0,0,0,0,0,0,0,0,0,0,0},

    {kIOPMPowerStateVersion1,kIOPMDeviceUsable,

    IOPMPowerOn,IOPMPowerOn,0,0,0,0,0,0,0,0}

    };


先頭に戻る



登録処理

電源管理の登録処理を完了するには、リスト 2 に示すように、3 つの関数を呼び出す必要があります。

まず、PMinit を呼び出して、電源管理インスタンス変数の割り当てと初期化を行います。必ず、PMinit を呼び出してから、これらの変数や電源管理メソッドにアクセスする必要があります。

次に、デバイスを自発的に制御する親クラスメソッドの registerPowerDriver を呼び出し、成功したかどうかを忘れずに確認します。

最後に、親クラスメソッドを呼び出して、I/O レジストリの IOPower プレーンを結びつける必要があります。



警告:
joinPMtree は、仮想のメソッドです。このメソッドをオーバーライドしないでください。joinPMtree や super::joinPMtree は呼び出さないでください。これらはオブジェクトをコンパイルしますが、I/O レジストリの IOPower プレーンの正しい部分に置かない場合があります。





リスト 2. 電源コントローラとしての登録


IOLog("PowerManagement is Starting¥n");

// IOService.h からスーパークラス変数を初期化する

        PMinit();

// IOService.h から制御ドライバとして登録する

        myValue = registerPowerDriver( this,

 (IOPMPowerState *) ourPowerStates, kNumDTSStates );

        if (myValue != kIOReturnSuccess) {

        IOLog("%s: Failed to registerPowerDriver.¥n", getName());

        }

        // IOService.h からツリーを結びつける

        provider->joinPMtree( this);




先頭に戻る



電源イベントへの応答

最後のステップでは、IOService である親の setPowerState メソッドを実装(オーバーライド)します。ドライバは、デバイスの電力を上げたり下げたりする方法を理解している唯一の実体です。リスト 3 に示す宣言をヘッダファイルに置きます。



リスト 3. setPowerState 宣言


virtual IOReturn setPowerState(unsigned long, IOService *);




本稿では、この程度の実装で十分です。「I/O Kit Fundamentals」の 10 章で、この実装について詳しく知ることができます。

しかし、アップルメニューを使ってコンピュータをスリープ状態にする場合は、この実装は IOLog にエントリを記録します。



リスト 4. setPowerState の実装


IOReturn com_DTS_iokit_HelloIOKit::setPowerState(

unsigned long whatState, IOService* dontCare){

    IOLog("Setting power state:%lu¥n", whatState);

    // ここでデバイスのオン/オフを切り替える

    return IOPMAckImplied;

}




必要なのは、単純なオン/オフ式の省電力ドライバを持つことだけです。これらの 3 つのステップは、完全な I/O Kit KEXT にあるので、見てみましょう。

先頭に戻る



プロジェクト

最後に挙げる Project Builder プロジェクトは、Hello I/O Kit tutorial からの引用です。

アップルでの開発に慣れていない方は、このチュートリアルから始めてもよいでしょう。そうでない方は、プロジェクトを単にダウンロードしてください。このプロジェクトには、上で解説した電源管理の 3 つのステップが含まれており、いつでも実行できるようになっています。KEXT を「Extensions」フォルダにロードする方法を知っている必要があります。わからない場合は、チュートリアルの「Test the Device Driver」のセクションを参照してください。

先頭に戻る



その他のソース

最後に、時間があれば、次のソースから電源管理に関する追加情報を入手できます。

Power Manager DDK には、サンプルやツールなどが含まれています。

I/O Kit Fundamentals」の 10 章「電源とデバイス取り外し管理」にも最新情報があります。

関連するテクニカルノート TN 2075「PowerManagement for Macintosh; getting started」では、さまざまな電源管理データに対するすべてのリンクを説明しています。

みなさまの開発が成功されることをお祈りしております。DTS Engineering

先頭に戻る



ダウンロード

プロジェクト (6K)

ダウンロード